home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995…tember: Reference Library / Dev.CD Sep 95 RL / Dev.CD Sep 95 RL.toast / mac / Technical Documentation / develop / develop Issue 6 code / TCP / NewsWatcher / NW Source / Source / aevt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-23  |  12.6 KB  |  473 lines  |  [TEXT/MMCC]

  1. /*----------------------------------------------------------------------------
  2.  
  3.     aevt.c
  4.  
  5.     This module handles Apple events.
  6.     
  7.     Copyright © 1994-1995, Northwestern University.
  8.  
  9. ----------------------------------------------------------------------------*/
  10.  
  11. #include <stdio.h>
  12.  
  13. #include "glob.h"
  14. #include "aevt.h"
  15. #include "dialog.h"
  16. #include "newsrc.h"
  17. #include "memutil.h"
  18. #include "message.h"
  19. #include "group.h"
  20. #include "newswatcher.h"
  21. #include "status.h"
  22. #include "full.h"
  23. #include "subscribe.h"
  24. #include "print.h"
  25. #include "windutil.h"
  26. #include "wind.h"
  27. #include "url.h"
  28.  
  29.  
  30.  
  31. #define kInitialGroupsResId        200            /* STR# resource id of intial group list
  32.                                                customization resource */
  33.  
  34. #define kOpenPrefsFileDlg                156
  35. #define kOpenPrefsFileDlgQuitItem        1
  36.  
  37.  
  38.  
  39. static AppleEvent *gFirstEvent;
  40. static AppleEvent *gFirstReply;
  41.  
  42. static AEEventHandlerUPP gHandleOAPPUPP;
  43. static AEEventHandlerUPP gHandleODOCUPP;
  44. static AEEventHandlerUPP gHandlePDOCUPP;
  45. static AEEventHandlerUPP gHandleQUITUPP;
  46. static AEEventHandlerUPP gHandleGURLUPP;
  47. static AEEventHandlerUPP gHandleFirstEventUPP;
  48.  
  49.  
  50.  
  51. /*----------------------------------------------------------------------------
  52.     MyGotRequiredParams 
  53.     
  54.     Check for unexpected required parameters. See NIM:IAC 4-35.
  55.     
  56.     Entry:    event = pointer to event.
  57.     
  58.     Exit:    function result = error code (errAEParamMissed if unexpected
  59.                 required parameter).
  60. ----------------------------------------------------------------------------*/
  61.  
  62. static OSErr MyGotRequiredParams (AppleEvent *event)
  63. {
  64.     OSErr err = noErr;
  65.     DescType returnedType;
  66.     Size actualSize;
  67.     
  68.     err = AEGetAttributePtr(event, keyMissedKeywordAttr, typeWildCard,
  69.         &returnedType, nil, 0, &actualSize);
  70.     return err == errAEDescNotFound ? noErr : errAEParamMissed;
  71. }
  72.  
  73.  
  74.  
  75. /*----------------------------------------------------------------------------
  76.     HandleOAPP 
  77.     
  78.     Handle the open application event.
  79. ----------------------------------------------------------------------------*/
  80.  
  81. static pascal OSErr HandleOAPP (AppleEvent *event, AppleEvent *reply, long refcon)
  82. {
  83.     WindowPtr wind;
  84.     OSErr err = noErr;
  85.     Boolean addingInitialSubscribedGroupsStatusMesageDisplayed = false;
  86.     short i;
  87.     Str255 groupName;
  88.     long groupIndex;
  89.     long nameOffset;
  90.  
  91.     err = MyGotRequiredParams(event);
  92.     if (err != noErr) goto exit;
  93.     if (gStartingUp) {
  94.         if (gPrefs.autoFetchNewsrc) return noErr;
  95.         err = MakeNewUntitledUserGroupWindow(&wind);
  96.         if (err != noErr) goto exit;
  97.         SendBehind(wind, nil);
  98.         if (!gPrefsFileFoundAtStartup) {
  99.             i = 1;
  100.             while (true) {
  101.                 *groupName = 0;
  102.                 GetIndString(groupName, kInitialGroupsResId, i);
  103.                 if (*groupName == 0) break;
  104.                 if (!addingInitialSubscribedGroupsStatusMesageDisplayed) {
  105.                     err = DisplayStatusMessageNumber(kStrAddingInitialSubscribedGroups);
  106.                     if (err != noErr) goto exit;
  107.                     addingInitialSubscribedGroupsStatusMesageDisplayed = true;
  108.                 }
  109.                 p2cstr(groupName);
  110.                 groupIndex = FindGroupIndex((char*)groupName);
  111.                 if (groupIndex != -1) {
  112.                     nameOffset = (*gFullGroupArray)[groupIndex].nameOffset;
  113.                     err = AddNewGroup(nameOffset, wind, 0x7fff, nil, false);
  114.                     if (err != noErr) goto exit;
  115.                 }
  116.                 i++;
  117.             }
  118.             err = DoZoom(wind, inZoomOut);
  119.             if (err != noErr) goto exit;
  120.         }
  121.         return noErr;
  122.     } else {
  123.         if (!gStartupOK) return userCanceledErr;
  124.         return MakeNewUntitledUserGroupWindow(&wind);
  125.     }
  126.     
  127. exit:
  128.     
  129.     ReportSystemError(err);
  130.     return err;
  131. }
  132.  
  133.  
  134.  
  135. /*----------------------------------------------------------------------------
  136.     HandleODOC 
  137.     
  138.     Handle the open document event.
  139. ----------------------------------------------------------------------------*/
  140.  
  141. static pascal OSErr HandleODOC (AppleEvent *event, AppleEvent *reply, long refcon)
  142. {
  143.     OSErr err = noErr;
  144.     AEDescList docList = {0, nil};
  145.     long numItems, i;
  146.     AEKeyword keywd;
  147.     DescType returnedType;
  148.     Size actualSize;
  149.     FSSpec fSpec;
  150.     FInfo fndrInfo;
  151.     DialogPtr dlg;
  152.     short item;
  153.     WindowPtr wind;
  154.     
  155.     if (!gStartupOK) return userCanceledErr;
  156.     err = AEGetParamDesc(event, keyDirectObject, typeAEList, &docList);
  157.     if (err != noErr) goto exit;
  158.     err = MyGotRequiredParams(event);
  159.     if (err != noErr) goto exit;
  160.     err = AECountItems(&docList, &numItems);
  161.     if (err != noErr) goto exit;
  162.     for (i = 1; i <= numItems; i++) {
  163.         err = AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType,
  164.             (Ptr)&fSpec, sizeof(fSpec), &actualSize);
  165.         if (err != noErr) goto exit;
  166.         err = FSpGetFInfo(&fSpec, &fndrInfo);
  167.         if (err != noErr) goto exit;
  168.         if (fndrInfo.fdType == kPrefsFileType && !gStartingUp) goto exit1;
  169.         if (fndrInfo.fdType == kSavedUserGroupListFileType) {
  170.             err = OpenUserGroupListFile(&fSpec);
  171.         } else if (fndrInfo.fdType == kSavedMessageFileType) {
  172.             err = OpenMessageFile(&fSpec, &wind);
  173.         }
  174.         if (err != noErr) goto exit;
  175.     }
  176.     err = AEDisposeDesc(&docList);
  177.     if (err != noErr) goto exit;
  178.     return noErr;
  179.  
  180. exit:
  181.  
  182.     if (docList.dataHandle != nil) AEDisposeDesc(&docList);
  183.     ReportSystemError(err);
  184.     return err;
  185.  
  186. exit1:
  187.  
  188.     if (docList.dataHandle != nil) AEDisposeDesc(&docList);
  189.     err = MyGetNewDialog(kOpenPrefsFileDlg, kOpenPrefsFileDlgQuitItem, cancel, &dlg);
  190.     if (err != noErr) return err;
  191.     SysBeep(0);
  192.     MyModalDialog(dlg, gDialogFilterUPP, &item);
  193.     err = DoClose(dlg);
  194.     if (err != noErr) return err;
  195.     if (item == kOpenPrefsFileDlgQuitItem) gDone = true;
  196.     return userCanceledErr;
  197. }
  198.  
  199.  
  200.  
  201. /*----------------------------------------------------------------------------
  202.     HandlePDOC 
  203.     
  204.     Handle the print document event.
  205. ----------------------------------------------------------------------------*/
  206.  
  207. static pascal OSErr HandlePDOC (AppleEvent *event, AppleEvent *reply, long refcon)
  208. {
  209.     OSErr err = noErr;
  210.     AEDescList docList = {0, nil};
  211.     long numItems, i;
  212.     AEKeyword keywd;
  213.     DescType returnedType;
  214.     Size actualSize;
  215.     FSSpec fSpec;
  216.     FInfo fndrInfo;
  217.     WindowPtr wind;
  218.     TWindow **info;
  219.     TEHandle theTE;
  220.     Handle text;
  221.     CStr255 title;
  222.     long start, end;
  223.     Boolean firstFile = true;
  224.     
  225.     if (!gStartupOK) return userCanceledErr;
  226.     wind = MyFrontWindow();
  227.     if (GetMyWindowKind(wind) == kStatus) DoClose(wind);
  228.     err = AEGetParamDesc(event, keyDirectObject, typeAEList, &docList);
  229.     if (err != noErr) goto exit;
  230.     err = MyGotRequiredParams(event);
  231.     if (err != noErr) goto exit;
  232.     err = AECountItems(&docList, &numItems);
  233.     if (err != noErr) goto exit;
  234.     for (i = 1; i <= numItems; i++) {
  235.         err = AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType,
  236.             (Ptr)&fSpec, sizeof(fSpec), &actualSize);
  237.         if (err != noErr) goto exit;
  238.         err = FSpGetFInfo(&fSpec, &fndrInfo);
  239.         if (err != noErr) goto exit;
  240.         if (fndrInfo.fdType == kSavedMessageFileType) {
  241.             err = OpenMessageFile(&fSpec, &wind);
  242.             if (err != noErr) goto exit;
  243.             HandleUpdate(wind);
  244.             if (firstFile) {
  245.                 err = StartPrint();
  246.                 if (err != noErr) goto exit;
  247.                 err = DisplayStatusMessageNumber(kStrPrinting);
  248.                 if (err != noErr) goto exit;
  249.                 firstFile = false;
  250.             }
  251.             GetWTitle(wind, (StringPtr)title);
  252.             p2cstr((StringPtr)title);
  253.             info = (TWindow**)GetWRefCon(wind);
  254.             theTE = (**info).theTE;
  255.             text = (**theTE).hText;
  256.             start = 0;
  257.             end = MyGetHandleSize(text);
  258.             err = PrintText(text, start, end, title);
  259.             if (err != noErr) goto exit;
  260.             err = DoClose(wind);
  261.             if (err != noErr) goto exit;
  262.         }
  263.     }
  264.     err = AEDisposeDesc(&docList);
  265.     if (err != noErr) goto exit;
  266.     return noErr;
  267.  
  268. exit:
  269.  
  270.     if (docList.dataHandle != nil) AEDisposeDesc(&docList);
  271.     ReportSystemError(err);
  272.     return err;
  273. }
  274.  
  275.  
  276.  
  277. /*----------------------------------------------------------------------------
  278.     HandleQUIT 
  279.     
  280.     Handle the quit application event.
  281. ----------------------------------------------------------------------------*/
  282.  
  283. static pascal OSErr HandleQUIT (AppleEvent *event, AppleEvent *reply, long refcon)
  284. {
  285.     OSErr err = noErr;
  286.  
  287.     err = MyGotRequiredParams(event);
  288.     if (err != noErr) return err;
  289.     gDone = true;
  290.     return noErr;
  291. }
  292.  
  293.  
  294.  
  295. /*----------------------------------------------------------------------------
  296.     HandleGURL 
  297.     
  298.     Handle the get url event.
  299. ----------------------------------------------------------------------------*/
  300.  
  301. static pascal OSErr HandleGURL (AppleEvent *event, AppleEvent *reply, long refcon)
  302. {
  303.     CStr255 url;
  304.     DescType typeCode;
  305.     Size actualSize;
  306.     OSErr err = noErr;
  307.     OSErr result = noErr;
  308.  
  309.     if (!gStartupOK) return userCanceledErr;
  310.     err = AEGetParamPtr(event, keyDirectObject, typeChar, &typeCode, url, 
  311.         255, &actualSize);
  312.     if (err != noErr) return err;
  313.     err = MyGotRequiredParams(event);
  314.     if (err != noErr) return err;
  315.     url[actualSize] = 0;
  316.     result = OpenURLString(url);
  317.     if (reply->dataHandle != nil) {
  318.         err = AEPutParamPtr(reply, keyDirectObject, typeShortInteger,
  319.             &result, sizeof(result));
  320.         if (err != noErr) return err;
  321.     } else {
  322.         switch (result) {
  323.             case paramErr:
  324.                 ErrorMessageNumber(kStrURLSyntaxError);
  325.                 break;
  326.             case fnfErr:
  327.                 NoteMessageNumber(kStrArticleOrGroupNotFound);
  328.                 break;
  329.             default:
  330.                 ReportSystemError(result);
  331.                 break;
  332.         }
  333.     }
  334.     return noErr;
  335. }
  336.  
  337.  
  338.  
  339. /*----------------------------------------------------------------------------
  340.     HandleFirstEvent 
  341.     
  342.     Handle the first event.
  343. ----------------------------------------------------------------------------*/
  344.  
  345. static pascal OSErr HandleFirstEvent (AppleEvent *event, AppleEvent *reply, long refcon)
  346. {
  347.     *gFirstEvent = *event;
  348.     *gFirstReply = *reply;
  349.     return AESuspendTheCurrentEvent(event);
  350. }
  351.  
  352.  
  353.  
  354. /*----------------------------------------------------------------------------
  355.     InitializeAppleEvents 
  356.     
  357.     Initialize Apple events. Get the first event and suspend it. The caller 
  358.     must resume this first event to actually process it when initialization
  359.     is complete.
  360.     
  361.     Exit:    funtion result = error code.
  362.             firstEvent = event record for first event.
  363.             firstReply = reply record for first event.
  364. ----------------------------------------------------------------------------*/
  365.  
  366. OSErr InitializeAppleEvents (AppleEvent *firstEvent, AppleEvent *firstReply)
  367. {
  368.     OSErr err = noErr;
  369.     Boolean gotEvt;
  370.     EventRecord ev;
  371.     
  372.     gFirstEvent = firstEvent;
  373.     gFirstReply = firstReply;
  374.  
  375.     gHandleOAPPUPP = NewAEEventHandlerProc(HandleOAPP);
  376.     gHandleODOCUPP = NewAEEventHandlerProc(HandleODOC);
  377.     gHandlePDOCUPP = NewAEEventHandlerProc(HandlePDOC);
  378.     gHandleQUITUPP = NewAEEventHandlerProc(HandleQUIT);
  379.     gHandleGURLUPP = NewAEEventHandlerProc(HandleGURL);
  380.     gHandleFirstEventUPP = NewAEEventHandlerProc(HandleFirstEvent);
  381.  
  382.     err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
  383.         gHandleFirstEventUPP, 0, false);
  384.     if (err != noErr) return err;
  385.     err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
  386.         gHandleFirstEventUPP, 0, false);
  387.     if (err != noErr) return err;
  388.     err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
  389.         gHandleFirstEventUPP, 0, false);
  390.     if (err != noErr) return err;
  391.     err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
  392.         gHandleFirstEventUPP, 0, false);
  393.     if (err != noErr) return err;
  394.     err = AEInstallEventHandler(kGetURLEventClass, kGetURLEventID,
  395.         gHandleFirstEventUPP, 0, false);
  396.     if (err != noErr) return err;
  397.  
  398.     while (true) {
  399.         gotEvt = WaitNextEvent(highLevelEventMask | activMask | updateMask | osMask, 
  400.             &ev, GetCaretTime(), nil);
  401.         if (gotEvt && ev.what == kHighLevelEvent) {
  402.             err = AEProcessAppleEvent(&ev);
  403.             if (err != noErr) return err;
  404.             break;
  405.         }
  406.         if (gotEvt) HandleEvent(&ev);
  407.     }
  408.     
  409.     err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
  410.         gHandleOAPPUPP, 0, false);
  411.     if (err != noErr) return err;
  412.     err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
  413.         gHandleODOCUPP, 0, false);
  414.     if (err != noErr) return err;
  415.     err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
  416.         gHandlePDOCUPP, 0, false);
  417.     if (err != noErr) return err;
  418.     err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
  419.         gHandleQUITUPP, 0, false);
  420.     if (err != noErr) return err;
  421.     err = AEInstallEventHandler(kGetURLEventClass, kGetURLEventID,
  422.         gHandleGURLUPP, 0, false);
  423.     return err;
  424. }
  425.  
  426.  
  427.  
  428. /*----------------------------------------------------------------------------
  429.     MyAEProcessAppleEvent 
  430.     
  431.     Process an Apple event.
  432.     
  433.     Entry:    ev = pointer to event record.
  434.     
  435.     Exit:    funtion result = error code.
  436. ----------------------------------------------------------------------------*/
  437.  
  438. OSErr MyAEProcessAppleEvent (EventRecord *ev)
  439. {
  440.     OSErr err = noErr;
  441.     
  442.     gAEServer = true;
  443.     err = AEProcessAppleEvent(ev);
  444.     gAEServer = false;
  445.     return err;
  446. }
  447.  
  448.  
  449.  
  450. /*----------------------------------------------------------------------------
  451.     MyAEResumeTheCurrentEvent 
  452.     
  453.     Resume processing an Apple event.
  454.     
  455.     Entry:    event = pointer to event record.
  456.             reply = pointer to reply record.
  457.             dispatcher = pointer to event handler.
  458.             handlerRefcon = refcon.
  459.     
  460.     Exit:    funtion result = error code.
  461. ----------------------------------------------------------------------------*/
  462.  
  463. OSErr MyAEResumeTheCurrentEvent (AppleEvent *event, AppleEvent *reply,
  464.     AEEventHandlerUPP dispatcher, long handlerRefCon)
  465. {
  466.     OSErr err = noErr;
  467.     
  468.     gAEServer = true;
  469.     err = AEResumeTheCurrentEvent(event, reply, dispatcher, handlerRefCon);
  470.     gAEServer = false;
  471.     return err;
  472. }
  473.